/**
 * @Author       : Hejh(3010733382@qq.com)
 * @Version      : V1.0
 * @Date         : 2024-01-19 11:43:03
 * @Description  : 用户相关操作成功后的日志记录
 */

const { LOG_TYPE } = require('@/constants/log')
const { Role, Department, UserDepartment, User } = require('@/models/model')
const { getUserDepByDepartments } = require('@/utils/getModelInfo')
const { logRecord } = require('@/utils/logRecord')
const { Op } = require('sequelize')

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户登录成功之后的日志记录
 * @param {*} ctx
 * @param {*} next
 */
module.exports.userLoginLog = async (ctx, next) => {
  await next()
  if (+ctx.body.code === 0) {
    await logRecord(ctx, LOG_TYPE.USER_LOGIN, {
      userId: ctx.user.id,
      username: ctx.user.username
    })
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户注册成功之后的日志记录
 * @param {*} ctx
 * @param {*} next
 */
module.exports.userRegisterLog = async (ctx, next) => {
  await next()
  if (+ctx.body.code === 0) {
    await logRecord(ctx, LOG_TYPE.USER_REGISTER, ctx.logs)
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户退出登录成功之后的日志记录
 * @param {*} ctx
 * @param {*} next
 */
module.exports.userLogoutLog = async (ctx, next) => {
  await next()
  if (+ctx.body.code === 0) {
    await logRecord(ctx, LOG_TYPE.USER_LOGOUT, {
      userId: ctx.user.id,
      username: ctx.user.username
    })
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户更新个人信息时的日志记录，需要记录哪些字段更新了
 * @param {*} ctx
 * @param {*} next
 */
module.exports.updateUserLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    const { logs } = ctx
    for (let i = 0; i < logs.length; i++) {
      await logRecord(ctx, logs[i].type, logs[i])
    }
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户重置密码（密码找回）时的日志记录
 * @param {*} ctx
 * @param {*} next
 */
module.exports.userFindPwdLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    await logRecord(ctx, LOG_TYPE.USER_PWD_FIND, ctx.logs)
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户创建时的日志记录，记录创建时的状态（管理员操作）
 * @param {*} ctx
 * @param {*} next
 */
module.exports.createUserLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    const { departments } = ctx.request.body
    const { username, nickname, sizeMax, sex, email, phone, roleId } =
      ctx.logs.user
    // 查询出系统用户信息
    const sysRole = await Role.findByPk(BigInt(roleId), {
      attributes: ['id', 'name']
    })

    // 查询出用户所处部门的详情
    const userDeps = await getUserDepByDepartments(departments)

    await logRecord(ctx, LOG_TYPE.USER_CREATE, {
      // 外层字段代表现如今操作实体的情况
      userId: ctx.user.id, // 操作者
      // 创建时需要记录的东西（是当时的情况）
      add: {
        user: {
          id: ctx.logs.userId,
          username,
          nickname,
          sizeMax,
          roleId,
          roleName: sysRole.name,
          sex,
          email,
          phone
        }, // 添加时用户名称
        userDeps // 用户对应的部门信息,
      }
    })
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 用户迁移到其他部门日志记录
 * @param {*} ctx
 * @param {*} next
 */
module.exports.moveToDepLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    let { userIds, departmentId, curDepId } = ctx.request.body
    userIds = userIds.map((v) => BigInt(v))

    // const userDeps = await UserDepartment.findAll({
    //   where: {
    //     departmentId,
    //     userId: {
    //       [Op.in]: userIds
    //     }
    //   },
    //   attributes: ['userId']
    // })

    const users = await User.findAll({
      where: {
        id: {
          [Op.in]: userIds
        }
      },
      attributes: ['id', 'username']
    })

    const dep = await Department.findByPk(BigInt(departmentId), {
      attributes: ['id', 'name']
    })
    // 记录一下用户和部门情况

    for (let i = 0; i < users.length; i++) {
      await logRecord(ctx, LOG_TYPE.USER_DEP_MOVE, {
        // 外层字段代表现如今操作实体的情况
        userId: ctx.user.id, // 操作者
        // 创建时需要记录的东西（是当时的情况）
        update: {
          user: {
            id: users[i].id,
            username: users[i].name
          },
          dep: {
            id: dep.id,
            name: dep.name
          }
        }
      })
    }
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 添加已有用户到部门日志记录
 * @param {*} ctx
 * @param {*} next
 */
module.exports.copyToDepLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    let { userIds, departments } = ctx.request.body
    userIds = userIds.map((v) => BigInt(v))

    const users = await User.findAll({
      where: {
        id: {
          [Op.in]: userIds
        }
      },
      attributes: ['id', 'username']
    })

    const userDeps = await getUserDepByDepartments(departments)
    // 记录一下用户和部门情况
    for (let i = 0; i < users.length; i++) {
      await logRecord(ctx, LOG_TYPE.USER_DEP_COPY, {
        // 外层字段代表现如今操作实体的情况
        userId: ctx.user.id, // 操作者
        // 创建时需要记录的东西（是当时的情况）
        update: {
          user: {
            id: users[i].id,
            username: users[i].username
          },
          userDeps
        }
      })
    }
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 批量设置用户在部门的容量
 * @param {*} ctx
 * @param {*} next
 */
module.exports.setUserDepsSizeMaxLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    let { userIds, sizeMax, curDepId } = ctx.request.body
    userIds = userIds.map((v) => BigInt(v))

    // const userDeps = await UserDepartment.findAll({
    //   where: {
    //     departmentId:curDepId,
    //     userId: {
    //       [Op.in]: userDepIds
    //     }
    //   },
    //   attributes: ['userId', 'departmentId']
    // })

    // 记录一下用户和部门情况
    for (let i = 0; i < userIds.length; i++) {
      const user = await User.findByPk(BigInt(userIds[i]), {
        attributes: ['id', 'username']
      })
      const dep = await Department.findByPk(BigInt(curDepId), {
        attributes: ['id', 'name']
      })

      await logRecord(ctx, LOG_TYPE.USER_UPDATE, {
        // 外层字段代表现如今操作实体的情况
        userId: ctx.user.id, // 操作者
        // 创建时需要记录的东西（是当时的情况）
        update: {
          user: {
            id: user.id,
            username: user.username
          },
          userDep: {
            dep: {
              id: dep.id,
              name: dep.name
            },
            sizeMax
          }
        }
      })
    }
  }
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 批量启用禁用用户
 * @param {*} ctx
 * @param {*} next
 */
module.exports.setUserStatusLog = async (ctx, next) => {
  await next()
  const { code } = ctx.body
  if (+code === 0) {
    let { userIds, status } = ctx.request.body

    const users = await User.findAll({
      where: {
        id: {
          [Op.in]: userIds
        }
      },
      attributes: ['id', 'username']
    })

    // 记录一下用户和部门情况
    for (let i = 0; i < users.length; i++) {
      await logRecord(ctx, LOG_TYPE.USER_ACTIVE, {
        // 外层字段代表现如今操作实体的情况
        userId: ctx.user.id, // 操作者
        // 创建时需要记录的东西（是当时的情况）
        update: {
          user: {
            id: users[i].id,
            username: users[i].username,
            status
          }
        }
      })
    }
  }
}
